NSString value not persistent











up vote
0
down vote

favorite












I am declaring class variable of type NSString in my "class.h":



@interface class : NSObject<GADInterstitialDelegate, 
GADBannerViewDelegate, GADRewardBasedVideoAdDelegate,
GADNativeAppInstallAdLoaderDelegate, GADNativeContentAdLoaderDelegate>
{
...
NSString* appId;
}


I the "class.mm" file In function "a" i am assigning a value to the variable:



appId = [[dic objectForKey:@"appid"] stringValue]


The string value at this point is correct.



The problem happen when other function call - function "b".



[GoogleMobileAdsMediationTestSuite presentWithAppID:appId onViewController:rootViewController delegate:nil];


when i try to use this appId - it doesn't contain the assigned, instead I assume it contain a memory address.



How can I keep the value of appId in all future references?










share|improve this question




















  • 2




    can you add some additional code
    – Anbu.karthik
    2 days ago










  • Checking at this code tell me there is no issue. Search for appId and check if it's value is updated some where else, also show code were you are displaying to value of appId.
    – rptwsthi
    2 days ago










  • Is appId a member variable? If yes, are you calling the functions a and b on the same object?
    – SSB95
    2 days ago










  • @rptwsthi can it be that the app id value is being cleared when dic (dictionary) is being cleared? So when the net function calls and dic is no longer valid the appId value points to unfilled address?
    – Michael A
    2 days ago










  • Please show the whole definition. How is that "class variable" declared?
    – Sulthan
    2 days ago















up vote
0
down vote

favorite












I am declaring class variable of type NSString in my "class.h":



@interface class : NSObject<GADInterstitialDelegate, 
GADBannerViewDelegate, GADRewardBasedVideoAdDelegate,
GADNativeAppInstallAdLoaderDelegate, GADNativeContentAdLoaderDelegate>
{
...
NSString* appId;
}


I the "class.mm" file In function "a" i am assigning a value to the variable:



appId = [[dic objectForKey:@"appid"] stringValue]


The string value at this point is correct.



The problem happen when other function call - function "b".



[GoogleMobileAdsMediationTestSuite presentWithAppID:appId onViewController:rootViewController delegate:nil];


when i try to use this appId - it doesn't contain the assigned, instead I assume it contain a memory address.



How can I keep the value of appId in all future references?










share|improve this question




















  • 2




    can you add some additional code
    – Anbu.karthik
    2 days ago










  • Checking at this code tell me there is no issue. Search for appId and check if it's value is updated some where else, also show code were you are displaying to value of appId.
    – rptwsthi
    2 days ago










  • Is appId a member variable? If yes, are you calling the functions a and b on the same object?
    – SSB95
    2 days ago










  • @rptwsthi can it be that the app id value is being cleared when dic (dictionary) is being cleared? So when the net function calls and dic is no longer valid the appId value points to unfilled address?
    – Michael A
    2 days ago










  • Please show the whole definition. How is that "class variable" declared?
    – Sulthan
    2 days ago













up vote
0
down vote

favorite









up vote
0
down vote

favorite











I am declaring class variable of type NSString in my "class.h":



@interface class : NSObject<GADInterstitialDelegate, 
GADBannerViewDelegate, GADRewardBasedVideoAdDelegate,
GADNativeAppInstallAdLoaderDelegate, GADNativeContentAdLoaderDelegate>
{
...
NSString* appId;
}


I the "class.mm" file In function "a" i am assigning a value to the variable:



appId = [[dic objectForKey:@"appid"] stringValue]


The string value at this point is correct.



The problem happen when other function call - function "b".



[GoogleMobileAdsMediationTestSuite presentWithAppID:appId onViewController:rootViewController delegate:nil];


when i try to use this appId - it doesn't contain the assigned, instead I assume it contain a memory address.



How can I keep the value of appId in all future references?










share|improve this question















I am declaring class variable of type NSString in my "class.h":



@interface class : NSObject<GADInterstitialDelegate, 
GADBannerViewDelegate, GADRewardBasedVideoAdDelegate,
GADNativeAppInstallAdLoaderDelegate, GADNativeContentAdLoaderDelegate>
{
...
NSString* appId;
}


I the "class.mm" file In function "a" i am assigning a value to the variable:



appId = [[dic objectForKey:@"appid"] stringValue]


The string value at this point is correct.



The problem happen when other function call - function "b".



[GoogleMobileAdsMediationTestSuite presentWithAppID:appId onViewController:rootViewController delegate:nil];


when i try to use this appId - it doesn't contain the assigned, instead I assume it contain a memory address.



How can I keep the value of appId in all future references?







ios objective-c nsstring






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 days ago

























asked 2 days ago









Michael A

2,4661247103




2,4661247103








  • 2




    can you add some additional code
    – Anbu.karthik
    2 days ago










  • Checking at this code tell me there is no issue. Search for appId and check if it's value is updated some where else, also show code were you are displaying to value of appId.
    – rptwsthi
    2 days ago










  • Is appId a member variable? If yes, are you calling the functions a and b on the same object?
    – SSB95
    2 days ago










  • @rptwsthi can it be that the app id value is being cleared when dic (dictionary) is being cleared? So when the net function calls and dic is no longer valid the appId value points to unfilled address?
    – Michael A
    2 days ago










  • Please show the whole definition. How is that "class variable" declared?
    – Sulthan
    2 days ago














  • 2




    can you add some additional code
    – Anbu.karthik
    2 days ago










  • Checking at this code tell me there is no issue. Search for appId and check if it's value is updated some where else, also show code were you are displaying to value of appId.
    – rptwsthi
    2 days ago










  • Is appId a member variable? If yes, are you calling the functions a and b on the same object?
    – SSB95
    2 days ago










  • @rptwsthi can it be that the app id value is being cleared when dic (dictionary) is being cleared? So when the net function calls and dic is no longer valid the appId value points to unfilled address?
    – Michael A
    2 days ago










  • Please show the whole definition. How is that "class variable" declared?
    – Sulthan
    2 days ago








2




2




can you add some additional code
– Anbu.karthik
2 days ago




can you add some additional code
– Anbu.karthik
2 days ago












Checking at this code tell me there is no issue. Search for appId and check if it's value is updated some where else, also show code were you are displaying to value of appId.
– rptwsthi
2 days ago




Checking at this code tell me there is no issue. Search for appId and check if it's value is updated some where else, also show code were you are displaying to value of appId.
– rptwsthi
2 days ago












Is appId a member variable? If yes, are you calling the functions a and b on the same object?
– SSB95
2 days ago




Is appId a member variable? If yes, are you calling the functions a and b on the same object?
– SSB95
2 days ago












@rptwsthi can it be that the app id value is being cleared when dic (dictionary) is being cleared? So when the net function calls and dic is no longer valid the appId value points to unfilled address?
– Michael A
2 days ago




@rptwsthi can it be that the app id value is being cleared when dic (dictionary) is being cleared? So when the net function calls and dic is no longer valid the appId value points to unfilled address?
– Michael A
2 days ago












Please show the whole definition. How is that "class variable" declared?
– Sulthan
2 days ago




Please show the whole definition. How is that "class variable" declared?
– Sulthan
2 days ago












3 Answers
3






active

oldest

votes

















up vote
0
down vote



accepted










You know how, see when you assign value it just keep reference form original object but soon you initialize new object with new alloc or call retain, it's a copy of original. You can keep retain or use



NSString *entityName = [[NSString alloc] initWithString:[[dic objectForKey:@"appid"] stringValue]];` 


Or may be you can define appId as:



@property (strong, nonatomic) NSString *appId; 


in interface and, refer it with self.appId.






share|improve this answer




























    up vote
    0
    down vote














    So i got it to work by doing this: appId = [[dic objectForKey:@"appid"] retain];




    If that compiles, it means that you've turned off ARC (automatic reference counting) for that file or for your whole project. There's little reason to do that these days, especially if you're not very familiar with the manual reference counting rules. The best solution is almost certainly to turn ARC back on and remove the retain call.




    So that means that the appId my assumption was correct and appId was referencing the "dic" object all this time? The question is how can i detach the appId from the "dic" object so it will stay alive even when the object is cleard?




    Basically, you were assigning a string to appId without retaining the string. When the dictionary you got it from was released, it also released all the objects that it contained, including the string that appId pointed to. With manual reference counting, which you are apparently using, you have to retain any objects that you keep a reference to, and release those objects when you no longer need that reference. If you create an object with alloc/init or new or copy (or some variant of those), you don't need to retain that object, but you do need to release it. You can read more about it in Memory Management Rules.






    share|improve this answer























    • So in case i alloc / init to the variable i still need to release it, so its quite the same as retain
      – Michael A
      yesterday










    • Yes, when you create an object, you need to release it. If you get an object that someone else created, you need to retain it until you're done with it, and then release it. But again, there's little point in doing that yourself — the compiler can do it better and more reliably than you can, so unless there's some real reason not to, just turn on ARC and let the compiler handle it for you.
      – Caleb
      yesterday


















    up vote
    -2
    down vote













    Try to alloc appID variable like: [NSString string] in "class.m" and then you can change value of this variable.
    You try to assign value to null






    share|improve this answer








    New contributor




    Nikita Nagatkin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.


















    • You can't change the string of the NSString you get back from [NSString string] — you can only replace it with a different string. And if you're just going to replace it, there's no point in allocating it in the first place.
      – Caleb
      2 days ago











    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














     

    draft saved


    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53372212%2fnsstring-value-not-persistent%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    0
    down vote



    accepted










    You know how, see when you assign value it just keep reference form original object but soon you initialize new object with new alloc or call retain, it's a copy of original. You can keep retain or use



    NSString *entityName = [[NSString alloc] initWithString:[[dic objectForKey:@"appid"] stringValue]];` 


    Or may be you can define appId as:



    @property (strong, nonatomic) NSString *appId; 


    in interface and, refer it with self.appId.






    share|improve this answer

























      up vote
      0
      down vote



      accepted










      You know how, see when you assign value it just keep reference form original object but soon you initialize new object with new alloc or call retain, it's a copy of original. You can keep retain or use



      NSString *entityName = [[NSString alloc] initWithString:[[dic objectForKey:@"appid"] stringValue]];` 


      Or may be you can define appId as:



      @property (strong, nonatomic) NSString *appId; 


      in interface and, refer it with self.appId.






      share|improve this answer























        up vote
        0
        down vote



        accepted







        up vote
        0
        down vote



        accepted






        You know how, see when you assign value it just keep reference form original object but soon you initialize new object with new alloc or call retain, it's a copy of original. You can keep retain or use



        NSString *entityName = [[NSString alloc] initWithString:[[dic objectForKey:@"appid"] stringValue]];` 


        Or may be you can define appId as:



        @property (strong, nonatomic) NSString *appId; 


        in interface and, refer it with self.appId.






        share|improve this answer












        You know how, see when you assign value it just keep reference form original object but soon you initialize new object with new alloc or call retain, it's a copy of original. You can keep retain or use



        NSString *entityName = [[NSString alloc] initWithString:[[dic objectForKey:@"appid"] stringValue]];` 


        Or may be you can define appId as:



        @property (strong, nonatomic) NSString *appId; 


        in interface and, refer it with self.appId.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 2 days ago









        rptwsthi

        8,49485292




        8,49485292
























            up vote
            0
            down vote














            So i got it to work by doing this: appId = [[dic objectForKey:@"appid"] retain];




            If that compiles, it means that you've turned off ARC (automatic reference counting) for that file or for your whole project. There's little reason to do that these days, especially if you're not very familiar with the manual reference counting rules. The best solution is almost certainly to turn ARC back on and remove the retain call.




            So that means that the appId my assumption was correct and appId was referencing the "dic" object all this time? The question is how can i detach the appId from the "dic" object so it will stay alive even when the object is cleard?




            Basically, you were assigning a string to appId without retaining the string. When the dictionary you got it from was released, it also released all the objects that it contained, including the string that appId pointed to. With manual reference counting, which you are apparently using, you have to retain any objects that you keep a reference to, and release those objects when you no longer need that reference. If you create an object with alloc/init or new or copy (or some variant of those), you don't need to retain that object, but you do need to release it. You can read more about it in Memory Management Rules.






            share|improve this answer























            • So in case i alloc / init to the variable i still need to release it, so its quite the same as retain
              – Michael A
              yesterday










            • Yes, when you create an object, you need to release it. If you get an object that someone else created, you need to retain it until you're done with it, and then release it. But again, there's little point in doing that yourself — the compiler can do it better and more reliably than you can, so unless there's some real reason not to, just turn on ARC and let the compiler handle it for you.
              – Caleb
              yesterday















            up vote
            0
            down vote














            So i got it to work by doing this: appId = [[dic objectForKey:@"appid"] retain];




            If that compiles, it means that you've turned off ARC (automatic reference counting) for that file or for your whole project. There's little reason to do that these days, especially if you're not very familiar with the manual reference counting rules. The best solution is almost certainly to turn ARC back on and remove the retain call.




            So that means that the appId my assumption was correct and appId was referencing the "dic" object all this time? The question is how can i detach the appId from the "dic" object so it will stay alive even when the object is cleard?




            Basically, you were assigning a string to appId without retaining the string. When the dictionary you got it from was released, it also released all the objects that it contained, including the string that appId pointed to. With manual reference counting, which you are apparently using, you have to retain any objects that you keep a reference to, and release those objects when you no longer need that reference. If you create an object with alloc/init or new or copy (or some variant of those), you don't need to retain that object, but you do need to release it. You can read more about it in Memory Management Rules.






            share|improve this answer























            • So in case i alloc / init to the variable i still need to release it, so its quite the same as retain
              – Michael A
              yesterday










            • Yes, when you create an object, you need to release it. If you get an object that someone else created, you need to retain it until you're done with it, and then release it. But again, there's little point in doing that yourself — the compiler can do it better and more reliably than you can, so unless there's some real reason not to, just turn on ARC and let the compiler handle it for you.
              – Caleb
              yesterday













            up vote
            0
            down vote










            up vote
            0
            down vote










            So i got it to work by doing this: appId = [[dic objectForKey:@"appid"] retain];




            If that compiles, it means that you've turned off ARC (automatic reference counting) for that file or for your whole project. There's little reason to do that these days, especially if you're not very familiar with the manual reference counting rules. The best solution is almost certainly to turn ARC back on and remove the retain call.




            So that means that the appId my assumption was correct and appId was referencing the "dic" object all this time? The question is how can i detach the appId from the "dic" object so it will stay alive even when the object is cleard?




            Basically, you were assigning a string to appId without retaining the string. When the dictionary you got it from was released, it also released all the objects that it contained, including the string that appId pointed to. With manual reference counting, which you are apparently using, you have to retain any objects that you keep a reference to, and release those objects when you no longer need that reference. If you create an object with alloc/init or new or copy (or some variant of those), you don't need to retain that object, but you do need to release it. You can read more about it in Memory Management Rules.






            share|improve this answer















            So i got it to work by doing this: appId = [[dic objectForKey:@"appid"] retain];




            If that compiles, it means that you've turned off ARC (automatic reference counting) for that file or for your whole project. There's little reason to do that these days, especially if you're not very familiar with the manual reference counting rules. The best solution is almost certainly to turn ARC back on and remove the retain call.




            So that means that the appId my assumption was correct and appId was referencing the "dic" object all this time? The question is how can i detach the appId from the "dic" object so it will stay alive even when the object is cleard?




            Basically, you were assigning a string to appId without retaining the string. When the dictionary you got it from was released, it also released all the objects that it contained, including the string that appId pointed to. With manual reference counting, which you are apparently using, you have to retain any objects that you keep a reference to, and release those objects when you no longer need that reference. If you create an object with alloc/init or new or copy (or some variant of those), you don't need to retain that object, but you do need to release it. You can read more about it in Memory Management Rules.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 23 hours ago









            rptwsthi

            8,49485292




            8,49485292










            answered 2 days ago









            Caleb

            108k16147237




            108k16147237












            • So in case i alloc / init to the variable i still need to release it, so its quite the same as retain
              – Michael A
              yesterday










            • Yes, when you create an object, you need to release it. If you get an object that someone else created, you need to retain it until you're done with it, and then release it. But again, there's little point in doing that yourself — the compiler can do it better and more reliably than you can, so unless there's some real reason not to, just turn on ARC and let the compiler handle it for you.
              – Caleb
              yesterday


















            • So in case i alloc / init to the variable i still need to release it, so its quite the same as retain
              – Michael A
              yesterday










            • Yes, when you create an object, you need to release it. If you get an object that someone else created, you need to retain it until you're done with it, and then release it. But again, there's little point in doing that yourself — the compiler can do it better and more reliably than you can, so unless there's some real reason not to, just turn on ARC and let the compiler handle it for you.
              – Caleb
              yesterday
















            So in case i alloc / init to the variable i still need to release it, so its quite the same as retain
            – Michael A
            yesterday




            So in case i alloc / init to the variable i still need to release it, so its quite the same as retain
            – Michael A
            yesterday












            Yes, when you create an object, you need to release it. If you get an object that someone else created, you need to retain it until you're done with it, and then release it. But again, there's little point in doing that yourself — the compiler can do it better and more reliably than you can, so unless there's some real reason not to, just turn on ARC and let the compiler handle it for you.
            – Caleb
            yesterday




            Yes, when you create an object, you need to release it. If you get an object that someone else created, you need to retain it until you're done with it, and then release it. But again, there's little point in doing that yourself — the compiler can do it better and more reliably than you can, so unless there's some real reason not to, just turn on ARC and let the compiler handle it for you.
            – Caleb
            yesterday










            up vote
            -2
            down vote













            Try to alloc appID variable like: [NSString string] in "class.m" and then you can change value of this variable.
            You try to assign value to null






            share|improve this answer








            New contributor




            Nikita Nagatkin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.


















            • You can't change the string of the NSString you get back from [NSString string] — you can only replace it with a different string. And if you're just going to replace it, there's no point in allocating it in the first place.
              – Caleb
              2 days ago















            up vote
            -2
            down vote













            Try to alloc appID variable like: [NSString string] in "class.m" and then you can change value of this variable.
            You try to assign value to null






            share|improve this answer








            New contributor




            Nikita Nagatkin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.


















            • You can't change the string of the NSString you get back from [NSString string] — you can only replace it with a different string. And if you're just going to replace it, there's no point in allocating it in the first place.
              – Caleb
              2 days ago













            up vote
            -2
            down vote










            up vote
            -2
            down vote









            Try to alloc appID variable like: [NSString string] in "class.m" and then you can change value of this variable.
            You try to assign value to null






            share|improve this answer








            New contributor




            Nikita Nagatkin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.









            Try to alloc appID variable like: [NSString string] in "class.m" and then you can change value of this variable.
            You try to assign value to null







            share|improve this answer








            New contributor




            Nikita Nagatkin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.









            share|improve this answer



            share|improve this answer






            New contributor




            Nikita Nagatkin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.









            answered 2 days ago









            Nikita Nagatkin

            1




            1




            New contributor




            Nikita Nagatkin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.





            New contributor





            Nikita Nagatkin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.






            Nikita Nagatkin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.












            • You can't change the string of the NSString you get back from [NSString string] — you can only replace it with a different string. And if you're just going to replace it, there's no point in allocating it in the first place.
              – Caleb
              2 days ago


















            • You can't change the string of the NSString you get back from [NSString string] — you can only replace it with a different string. And if you're just going to replace it, there's no point in allocating it in the first place.
              – Caleb
              2 days ago
















            You can't change the string of the NSString you get back from [NSString string] — you can only replace it with a different string. And if you're just going to replace it, there's no point in allocating it in the first place.
            – Caleb
            2 days ago




            You can't change the string of the NSString you get back from [NSString string] — you can only replace it with a different string. And if you're just going to replace it, there's no point in allocating it in the first place.
            – Caleb
            2 days ago


















             

            draft saved


            draft discarded



















































             


            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53372212%2fnsstring-value-not-persistent%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            404 Error Contact Form 7 ajax form submitting

            How to know if a Active Directory user can login interactively

            TypeError: fit_transform() missing 1 required positional argument: 'X'