Preface: Do a picture to browse the small demo, support arbitrarily add, delete the picture, the picture enlarges, shrinks, with the rectangle box. Subsequent blogs will explain in detail the various issues encountered during this process. This article is mainly about, in doing add, remove this function, encountered the problem of saving files.
We want to achieve in the future every time you open this program, do not have to add a manual, and will retain the last image that the user has selected, then you need to put these pictures in memory, every time read from memory.
Body:
There are several ways to save a file?
Write directly to file, object serialization
Second, write directly to file
In my program, I have a nsmutabledictionary of images, each of which corresponds to a key.
1, directly call Nsdictionary's writetofile:atomically: method, the DIC into a specified directory.
-(BOOL) WriteToFile: (NSString *) path atomically: (BOOL) flagdescription
Function: Writes a property list representation of the contents of the dictionary to a given path.
Writes a property list representing this dictionary content to the specified path.
Problem: Directory creation is not a problem, but has been writetofile write failed??
Analysis Ideas: Query method Comments, there is a passage:
This method recursively validates the contained objects is property list objects (instances of NSData, NSDate, N Snumber, NSString, Nsarray, or nsdictionary) before writing out of the file, and returns NO if all the objects is not proper Ty list objects, since the resultant file would not being a valid property list.
This method recursively verifies that all contained objects are objects in the property list (including NSData, NSDate, NSNumber, NSString, Nsarray, or nsdictionary) before the DIC is written to the file.
If all the objects in DIC are not all objects in the property list, return no because the last generated file is not a valid property list.
Reason for failure: because the obj in my dic is uiimage and does not belong to the property list, it fails to return.
Solution: Replace the UIImage with the object in the property list NSData, put NSData into DIC.
NSData *data = Uiimagepngrepresentation (IMG);
2. Remove from File
In WriteToFile's note, write to: If The dictionary ' s contents is all property list objects, the file written by this method can is use D to initialize a new dictionary with the class method Dictionarywithcontentsoffile:or the instance method initwithconten Tsoffile:.
If this dic content is a property list, then the file written by this method can be used to initialize a new dictionary, Method: Dictionarywithcontentsoffile: or Initwithcontentsoffile:.
Nsmutabledictionary *dic= [Nsmutabledictionary Dictionarywithcontentsoffile:_filepath];
Problem: When I call this dictionarywithcontentsoffile after a successful write, I get the new dic always having problems.
Analysis Reason: Write problem? parameter _filepath problem? Write if there is a problem, then it will not succeed, a new path to succeed, it is _filepath problem. Enter PO _filepath in the failed print box, which is a null pointer. The question is how I never thought of it. I set the _filepath as a global variable, and in the first Init method, I gave it a value, but how can it be nil here??
Take a look at my assignment method:
_filepath = [NSString stringwithformat:@ "%@/documents/imageviews/test.plist", Nshomedirectory ()];
Now you know where the problem is?!! In the previous blog detailed analysis of this problem, no use of alloc and other methods to construct the object, if in the other parts of the program to use, must add retain!!!
Modify everything after ok!
III. serialization of objects
When it comes to new content, let's review the Java object serialization first. In Java, objects that need to be serialized must implement the serializable interface to store and read objects by calling WriteObject, ReadObject.
In OC, it is similar. Objects that need to be serialized must implement the Nscoding protocol and override the Encodewithcoder and Initwithcoder two methods for encoding and deserializing, respectively, by invoking Nskeyedarchiver, Nskeyedunarchiver these two classes to store and read objects. If the inherited class already implements the Nscoding protocol, then the subclass is not implemented.
[Nskeyedarchiver archiverootobject:obj tofile:filename]; serialization of obj = [Nskeyedunarchiver unarchiveobjectwithfile:filename]; Deserialization
Because there is no attempt at the moment, just a brief introduction, when used to study in detail. Refer to: http://blog.csdn.net/holydancer/article/details/7371643
Iv. Summary
1, WriteToFile method, only applicable to NSData, NSDate, NSNumber, NSString, Nsarray, or nsdictionary these classes.
2, our custom class to write to the file, is the serialization method.
Serialization of IOS WriteToFile and objects